// Listing 14.8. Shape classes
#include <iostream>

using std::cout ;
using std::cin;
using std::endl;

class Shape
{
	public:
		Shape(){}
		~Shape(){}
		virtual long GetArea() = 0;
        virtual long GetPerim = 0;
        virtual void Draw() = 0;	
    private:		
};

class Circle: public Shape
{
	public:
		Circle(int radius):itsRadius(radius){}
		~Circle(){}
		long GetArea(){ return 3 * itsRadius * itsRadius; }
		long GetPerim(){ return 6 * itsRadius; }
		void Draw();
	private:
		int itsRadius;
		int itsCircumference;
};

void Circle::Draw()
{
	cout << "Circle draw routine here!\n";
}

class Rectangle : public Shape
{
	public:
		Rectangle(int len, int width):
			itsLength(len),itsWidth(width){}
		virtual ~Rectangle(){}
		virtual long GetArea(){ return itsLength * itsWidth; }
		virtual long GetPerim() { return 2 * itsLength + 2 * itsWidth; }
		virtual int GetLength() { return itsLength; }
		virtual int GetWidth() { return itsWidth; }
		virtual void Draw();
	private:
		int itsWidth;
		int itsLength;
};

void Rectangle::Draw()
{
	for(int i = 0; i < itsLength; i++)
	{
		for(int j = 0; j < itsWidth; j++)
		{
			cout << "x ";
		}
		cout << '\n';
	}
}

class Square : public Rectangle
{
	public:
		Square(int len);
		Square(int len, int width);
		~Square(){}
		long GetPerim() { return 4 * GetLength(); }
};

Square::Square(int len):
Rectangle(len,len){}

Square::Square(int len, int width):
Rectangle(len,width)
{
	if(GetLength() != GetWidth())
	{
		cout << "Error, not a square...a Rectangle??\n";
	}
}

int main(void)
{
	int choice;
	bool fQuit = false;
	Shape * sp;

	while(!fQuit)
	{
		cout << "(1)Circle (2)Rectangle (3)Square (0)Quit: ";
		cin >> choice;

		switch(choice)
		{
			case 0: fQuit = true;
				break;
		    case 1: sp = new Circle(5);
		        break;
		    case 2: sp = new Rectangle(4,6);
				break;	
		    case 3: sp = new Square(5);			
			    break;
			default:
			    cout << "Please enter a nmber between 0 and 3 \n";
		        continue;
		        break;		
		}
		if(!fQuit)
		{
			sp->Draw();
		}
		delete sp;
		sp = 0;
		cout << '\n';
	}
	return 0;
}
